\subsection{Détection du débordement de pile}

\paragraph{Présentation}
Lorsqu'un \textit{thread} déborde de sa pile l'ensemble du programme s'arrête du fait de l'erreur de segmentation. L'idée est donc de détecter les débordements de pile afin de tuer seulement le \textit{thread} qui l'effectue et de laisser les autres \textit{threads} se dérouler normalement.

\paragraph{Implémentation}
Pour détecter le débordement, la première idée a été de changer les droits de la fin de la pile afin de provoquer une erreur de segmentation. Ceci permet d'éviter la corruption des autres piles ou de la mémoire. Comme montré sur la figure \ref{detectionDebordement}, si on ne le fait pas alors il se peut que l'on arrive sur une zone non autorisée après avoir déjà écrasé la pile d'un autre \textit{thread} et donc l'erreur de segmentation arrivera trop tard. En changeant les droits de la fin de la pile l'erreur de segmentation se produira avant d'écraser des zones mémoires utilisées. Pour réaliser ce changement de droits, on utilise \texttt{mprotect} qui permet de changer les droits sur une page. Il faut donc allouer la pile avec \texttt{valloc} pour que celle-ci soit allouée et alignée sur une page.

\begin{figure}[H]
\center
\includegraphics[width=14cm]{./image/detectionDebordement.pdf}
\caption{Principe de la détection du débordement de la pile}
\label{detectionDebordement}
\end{figure}

Une fois que l'erreur de segmentation est lancée, il faut mettre en place en gestionnaire de signaux. Cependant dans le cas d'un débordement de pile le gestionnaire ne peut pas s'exécuter sur la pile car celle-ci est déjà pleine. Il faut alors mettre en place avec \texttt{sigaltstack} une pile alternative sur laquelle le gestionnaire de signaux va s'exécuter. Pour que le gestionnaire en question s'exécute bien sur la pile alternative il faut lui passer le \textit{flag} \texttt{SA\_{}ONSTACK} lors de sa création.

\paragraph{Tests}
Dans le test \texttt{91-stackProtector.c}, le main crée un \textit{thread} faisant des appels récursifs infinis et fait un \texttt{thread\_{}join} puis affiche un message. Les appels récursifs infinis aboutissent à un débordement de la pile qui est pris en charge par le gestionnaire de signaux. Le test s'exécutent sans erreur et le message du \textit{main} s'affiche.
